# -*- encoding: utf-8 -*-
# # 网页需要是纯表格才能用此代码，否则还需要定位到网页表格位置
# import pandas as pd
# url = 'http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html'
# html_data = pd.read_html(url)
# for i in html_data:
#     table_data = pd.DataFrame(i)
#     table_data.to_csv('table_.csv')   # 文件名称
#     print(table_data)
import pymysql
from lxml import etree
import requests

sql = """
CREATE TABLE `areas` (
  `id` int NOT NULL COMMENT '行政区划代码',
  `pid` int DEFAULT NULL COMMENT '父级行政区划代码',
  `level_num` int NOT NULL COMMENT '级别 1省、2市、3区 或层级',
  `level_type` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '地区类别 \r\n一级省级行政区，包括省、自治区、直辖市、特别行政区。\r\n二级地级行政区，包括地级市、地区、自治州、盟。\r\n三级县级行政区，包括市辖区、县级市、县、自治县、旗、自治旗、特区、林区。\r\n四级乡级行政区，包括街道、镇、乡、民族乡、苏木、民族苏木、县辖区\r\n\r\n来自百科',
  `full_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '地区全称',
  `short_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '简称  比如 北京市简称北京   内蒙古自治区简称内蒙古',
  `acronym_name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '所属省份简称  例如：广东：粤，河南：豫',
  `code_path` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '区划ID路径',
  `pinyin` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '地区名字拼音',
  `CityCode` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '区号',
  `postal_code` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '邮编',
  `FirstChar` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '首拼',
  `longitude` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '经度',
  `latitude` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '纬度',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='全国县以上行政区划信息   来源民政部 2020 http://www.mca.gov.cn/article/sj/xzqh/1980/202105/20210500033655.shtml  去除了三沙市的西沙和南沙区 目前还没有区号';"""


# 直接从民政部 采集整理地理区划信息
nationality_list = ['蒙古族', '回族', '藏族', '维吾尔族', '苗族', '彝族', '壮族', '布依族', '朝鲜族', '满族', '侗族', '瑶族', '白族', '土家族', '哈尼族',
                    '哈萨克族', '傣族', '黎族', '傈僳族', '佤族', '畲族', '高山族', '拉祜族', '水族', '东乡族', '纳西族', '景颇族', '柯尔克孜族', '土族',
                    '达斡尔族', '仫佬族', '羌族', '布朗族', '撒拉族', '毛南族', '仡佬族', '锡伯族', '阿昌族', '普米族', '塔吉克族', '怒族', '乌孜别克族', '俄罗斯族',
                    '鄂温克族', '德昂族', '保安族', '裕固族', '京族', '塔塔尔族', '独龙族', '鄂伦春族', '赫哲族', '门巴族', '珞巴族', '基诺族', '汉族']


def rreplace(string, old, new, max=1):
    """
    从右往左替换
    :param string:
    :param old:
    :param new:
    :param max:
    :return:
    """
    return string[::-1].replace(old[::-1], new[::-1], max)[::-1]


def remove_nationality(str1, nationality_list):
    for nationality in nationality_list:
        str1 = rreplace(str1, nationality, '')

    for i in ['蒙古', '柯尔克孜', '哈萨克', '维吾尔']:
        str1 = rreplace(str1, i, '')
    print(str1)
    return str1


def toShortName(full_name, keyword_info_list):
    short_name = full_name
    level_type = None
    for keyword_info in keyword_info_list:
        if full_name.endswith(keyword_info['end_str']):
            level_type = keyword_info['level_type']
            for replace_str in keyword_info['replace_strs']:
                print(replace_str)
                short_name = rreplace(short_name, replace_str, '')
                print(short_name)
            break

    print(level_type, short_name)
    if full_name == '神农架林区':
        level_type = '林区'
    if len(short_name) <= 1:
        short_name = full_name

    return level_type, short_name


headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Referer': 'http://www.mca.gov.cn/article/sj/xzqh/1980/202105/20210500033655.shtml',
    'Accept-Language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6',
    'If-None-Match': 'W/"825152-151781-5c5f5ed62bae1"',
    'If-Modified-Since': 'Wed, 30 Jun 2021 06:35:23 GMT',
}

response = requests.get('http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html', headers=headers, verify=False)
html_ = etree.HTML(response.text)
tr_list = html_.xpath('//div[@id="2020年12月份县以上行政区划代码_28320"]//tr[@height=19]')
# print(len(tr_list))


db = pymysql.connect(host='127.0.0.1', user='root', password='12345', database='hengxing', charset='utf8')
cursor = db.cursor()


replace_strs = nationality_list + ['蒙古', '柯尔克孜', '哈萨克', '维吾尔']
full_short_map = {'北京市': '京', '天津市': '津', '河北省': '冀', '山西省': '晋', '内蒙古自治区': '蒙', '辽宁省': '辽', '吉林省': '吉', '黑龙江省': '黑', '上海市': '沪', '江苏省': '苏', '浙江省': '浙', '安徽省': '皖', '福建省': '闽', '江西省': '赣', '山东省': '鲁', '河南省': '豫', '湖北省': '鄂', '湖南省': '湘', '广东省': '粤', '广西壮族自治区': '桂', '海南省': '琼', '重庆市': '渝', '四川省': '川', '贵州省': '贵', '云南省': '云', '西藏自治区': '藏', '陕西省': '陕', '甘肃省': '甘', '青海省': '青', '宁夏回族自治区': '宁', '新疆维吾尔自治区': '新', '台湾省': '台', '香港特别行政区': '港', '澳门特别行政区': '澳'}
pid_info = {
    1: None, 2: None, 3: None
}
for tr in tr_list:
    levels = tr.xpath('.//td[3]/span')
    if len(levels) > 0:
        level = etree.tostring(levels[0], encoding='utf8').decode().count(' ') + 1
    else:
        level = 1
        pid_info = {1: None, 2: None, 3: None}

    codes = tr.xpath('.//td[2]/text()')
    if len(codes) == 0:
        continue
    code = codes[0].strip()
    name = tr.xpath('.//td[3]/text()')[0].strip()

    pid = pid_info.get(level - 1) if pid_info.get(level - 1) else None
    if level > 2 and pid is None:
        pid = pid_info.get(level - 2)

    print('level:', level, 'name:', name, 'code:', code, 'pid:', pid)
    level_type = None
    short_name = None
    acronym_name = None
    if level == 1:
        keyword_info_list = [
            {
                'level_type': '省',
                'end_str': '省',
                'replace_strs': ['省'],
            },
            {
                'level_type': '自治区',
                'end_str': '自治区',
                'replace_strs': ['自治区', '壮族', '维吾尔族', '维吾尔', '回族'],
            },
            {
                'level_type': '直辖市',
                'end_str': '市',
                'replace_strs': ['市'],
            },
            {
                'level_type': '特别行政区',
                'end_str': '特别行政区',
                'replace_strs': ['特别行政区'],
            },
        ]
        level_type, short_name = toShortName(name, keyword_info_list)
        acronym_name = full_short_map[name]
    elif level == 2:
        keyword_info_list = [
            {
                'level_type': '地级市',
                'end_str': '市',
                'replace_strs': ['市'],
            },
            {
                'level_type': '自治州',
                'end_str': '自治州',
                'replace_strs': ['自治州'] + replace_strs,
            },
            {
                'level_type': '盟',
                'end_str': '盟',
                'replace_strs': ['盟'],
            },
            {
                'level_type': '地区',
                'end_str': '地区',
                'replace_strs': ['地区'],
            },
        ]
        level_type, short_name = toShortName(name, keyword_info_list)
    elif level == 3:
        replace_strs = nationality_list + ['蒙古', '柯尔克孜', '哈萨克', '维吾尔']
        keyword_info_list = [
            {
                'level_type': '县级市',
                'end_str': '市',
                'replace_strs': ['市'],
            },
            {
                'level_type': '自治县',
                'end_str': '自治县',
                'replace_strs': ['自治县'] + replace_strs,
            },
            {
                'level_type': '县',
                'end_str': '县',
                'replace_strs': ['县'],
            },
            {
                'level_type': '市辖区',
                'end_str': '区',
                'replace_strs': [],  # 部
            },
            {
                'level_type': '自治旗',
                'end_str': '自治旗',
                'replace_strs': ['自治旗'] + replace_strs,
            },
            {
                'level_type': '旗',
                'end_str': '旗',
                'replace_strs': ['旗'],
            },
            {
                'level_type': '自治州',
                'end_str': '自治州',
                'replace_strs': ['自治州'],
            },

        ]
        level_type, short_name = toShortName(name, keyword_info_list)
    cursor.execute("insert into areas(id,pid, level_num,level_type, full_name, short_name, acronym_name) values (%s,%s,%s,%s,%s,%s,%s)",
                   (
                       code,
                       pid,
                       level,
                       level_type,
                       name,
                       short_name,
                       acronym_name
                   ))
    pid_info[level] = code
db.commit()

